/**
 * @license
 * Copyright Google Inc. All Rights Reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be
 * found in the LICENSE file at https://angular.io/license
 */

'use strict';

describe('IndexedDB', ifEnvSupports('IDBDatabase', function () {
  var testZone = zone.fork();
  var db;

  beforeEach(function (done) {
    var openRequest = indexedDB.open('_zone_testdb');
    openRequest.onupgradeneeded = function(event) {
      db = event.target.result;
      var objectStore = db.createObjectStore('test-object-store', {
        keyPath: 'key'
      });
      objectStore.createIndex('key', 'key', { unique: true });
      objectStore.createIndex('data', 'data', { unique: false });

      objectStore.transaction.oncomplete = function() {
        var testStore = db.transaction('test-object-store', 'readwrite').objectStore('test-object-store');
        testStore.add({
          key: 1,
          data: 'Test data'
        });
        testStore.transaction.oncomplete = function() {
          done();
        }
      };
    };
  });

  afterEach(function(done) {
    db.close();

    var openRequest = indexedDB.deleteDatabase('_zone_testdb');
    openRequest.onsuccess = function(event) {
      done();
    };
  });

  describe('IDBRequest', function() {
    it('should bind EventTarget.addEventListener', function (done) {
      testZone.run(function () {
        db.transaction('test-object-store').objectStore('test-object-store').get(1).addEventListener('success', function(event) {
          expect(zone).toBeDirectChildOf(testZone);
          expect(event.target.result.data).toBe('Test data');
          done();
        });
      });
    });

    it('should bind onEventType listeners', function (done) {
      testZone.run(function () {
        db.transaction('test-object-store').objectStore('test-object-store').get(1).onsuccess = function(event) {
          expect(zone).toBeDirectChildOf(testZone);
          expect(event.target.result.data).toBe('Test data');
          done();
        };
      });
    });
  });

  describe('IDBCursor', function() {
    it('should bind EventTarget.addEventListener', function (done) {
      testZone.run(function () {
        db.transaction('test-object-store').objectStore('test-object-store').openCursor().addEventListener('success', function(event) {
          var cursor = event.target.result;
          if (cursor) {
            expect(zone).toBeDirectChildOf(testZone);
            expect(cursor.value.data).toBe('Test data');
            done();
          } else {
            throw 'Error while reading cursor!';
          }
        });
      });
    });

    it('should bind onEventType listeners', function (done) {
      testZone.run(function () {
        db.transaction('test-object-store').objectStore('test-object-store').openCursor().onsuccess = function(event) {
          var cursor = event.target.result;
          if (cursor) {
            expect(zone).toBeDirectChildOf(testZone);
            expect(cursor.value.data).toBe('Test data');
            done();
          } else {
            throw 'Error while reading cursor!';
          }
        };
      });
    });
  });

  describe('IDBIndex', function() {
    it('should bind EventTarget.addEventListener', function (done) {
      testZone.run(function () {
        db.transaction('test-object-store').objectStore('test-object-store').index('data').get('Test data').addEventListener('success', function(event) {
          expect(zone).toBeDirectChildOf(testZone);
          expect(event.target.result.key).toBe(1);
          done();
        });
      });
    });

    it('should bind onEventType listeners', function (done) {
      testZone.run(function () {
        db.transaction('test-object-store').objectStore('test-object-store').index('data').get('Test data').onsuccess = function(event) {
          expect(zone).toBeDirectChildOf(testZone);
          expect(event.target.result.key).toBe(1);
          done();
        };
      });
    });
  });
}));